// Pimpl:  Point to  Implementation

// Scope.h

#include <memory>

class Scope {
public:
    explicit Scope(int tempreture);

    ~Scope();

    int GetOrientation() const;

private:
    class ScopeImpl;

    // ScopeImpl* pImpl = nullptr;  // OK!! Scope 在哪实现都OK。
    std::unique_ptr<ScopeImpl> pImpl;  // Error!! 当 Scope 的实现在 scope.cpp 中时。
                                           // 解决方法，定义一个析构函数 Scope::~Scope();
                                           // 并在 cpp 文件中定义 Scope::~Scope() = default;
};

// // 当使用unique_ptr定义 pImpl 成员时，
// // class Scope 的实现在另外的 cpp 文件中时，会报错：
// //  error: invalid application of ‘sizeof’ to incomplete type ‘Scope::ScopeImpl’
// //    79 |  static_assert(sizeof(_Tp)>0,
// // 具体原因是 unique_ptr 析构函数中会判断 sizeof(Scope::ScopeImpl),
// // 然而，在这个 .h 文件中并没有 Scope::ScopeImpl 的实现（因为 unique_ptr 析构函数是在 Scope的析构函数中调用吧）
// // 所以将 Scope的析构函数 放在 cpp 文件中定义就可以了，直接定义成 Scope::~Scope() = default; 就行。
//
// // 但如果 class Scope 的声明与实现在同一个文件就没问题，比如实现放在下面：

// /////////////////////////////////////////////////////////////////
// class Scope::ScopeImpl {
// public:
//     explicit ScopeImpl(int tempreture);
//     ~ScopeImpl() = default;

//     int GetOrientation() const;
// private:
//     int tempreture = 0;
// };

// Scope::ScopeImpl::ScopeImpl(int tempreture) {
//     this->tempreture = tempreture;
// }

// int Scope::ScopeImpl::GetOrientation() const {
//     return this->tempreture;
// }

// Scope::Scope(int tempreture) {
//   // this->pImpl = new ScopeImpl(tempreture);
//   // for unique_ptr
//   this->pImpl = std::make_unique<ScopeImpl>(tempreture);
// }

// int Scope::GetOrientation() const {
//     return this->pImpl->GetOrientation();
// }
